/*
 * 表单提交
 * 它允许捕获 jq 使用的特性值 
 * data-form="key&type" => key&type(键&指定类型[val(可为空)/text/html/attr])
 * url ：ajax提交后台的地址
 * sufun 成功回调函数
 * opts:可选参数
 * opts.jQuery 为jQuery库正规参数, 为了避免多参数合并设计
 * opts.addData 自定义一组自定义数据， 必须json格式
 * opts.checkboxOutType 可指定选中的多选输出格式，支持数组/拼接 默认 1,1格式
 * opts.log 回调 返回最后组装的数据
 */
$.fn.ajaxFormSubmit = function (url, sufun, opts) {
    /*
     * 获取对应的表单值
     */
    function getFormValues(obj, type) {
        if (type == "" || type == null || type === undefined) {
            return $(obj).val();
        }
        if (type == "val") {
            return $(obj).val();
        }
        if (type == "text") {
            return $(obj).text();
        }
        if (type == "html") {
            return $(obj).html();
        }
        if ($(obj).prop("tagName").toLocaleLowerCase() == "select") {
            return $(obj).children("option:selected").attr(type);
        }
        return $(obj).attr(type);
    }

    function _getFormJson(obj) {
        var _json = {};
        $(obj).find("*[data-form]").each(function (i, dom) {
            var ot = $(dom).attr("data-form");
            var keyName = ot.split("&")[0];
            var valType = ot.split("&")[1];
            if ($(dom).prop("tagName").toLocaleLowerCase() == "input") {
                var dom_type = $(dom).attr("type");
                if (dom_type == "radio") {
                    _json[keyName] = $("input[data-form='" + keyName + "']:checked").val();
                } else if (dom_type == "checkbox") {
                    var ckarr = $("input[data-form='" + keyName + "']:checked").map(function () {
                        return $(this).val();
                    }).get();
                    if (typeof (opts.checkboxOutType) == "string") {
                        _json[keyName] = ckarr.join(opts.checkboxOutType);
                    } else {
                        _json[keyName] = ckarr;
                    }
                } else {
                    _json[keyName] = getFormValues(this, valType);
                }
            } else {
                _json[keyName] = getFormValues(this, valType);
            }
        });
        return _json;
    }
    var _requestjson = {};
    opts = Object.assign({
        checkboxOutType: ",",
    }, opts);
    if (this.length > 1) {
        this.each(function (top_i, top_dom) {
            _requestjson[$(top_dom).attr("data-form-key")] = _getFormJson(top_dom);
        })
    } else {
        _requestjson = _getFormJson(this);
    }
    if (_requestjson.leng <= 0) {
        return;
    }
    if (opts.hasOwnProperty("addData")) _requestjson = Object.assign(_requestjson, opts.addData);
    var _requestData = opts.hasOwnProperty("overrideData") == false ? _requestjson : opts.overrideData(_requestjson);
    opts.log(_requestData);
    var _defaultJquery = Object.assign({
        type: "post",
        url: url,
        contentType: "application/json",
        data: JSON.stringify(_requestData),
        dataType: "json",
        success: function (rs) {
            sufun(rs);
        }
    }, opts.jQuery);
    $.ajax(_defaultJquery);
}